-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

-- packages de ada

SEPARATE (Tareas.Gmonitores)

   -- calcular un ejercicio en para un cliente en base a su tabla
PROCEDURE Calcular_Ejercicio (
      Cid    : IN     Task_Id;
      Tabla  : IN     Listas.Tabla_Ejercicios_Lists.List_Type;
      Ss     : IN     Tareas.Sseguimiento.Sseguimientoptr;
      Ejerc  :    OUT Ejerciciotype;
      Tiempo :    OUT Duration) IS
   Medicion           : Medicionbiometrica;
   It                 : Listas.Tabla_Ejercicios_Lists.List_Iterator;
   Encontrado         : Boolean                                     := False;
   Ultimoejercicio    : Ejerciciotype;
   Clientesinmedicion : Boolean;

BEGIN

   -- obtenemos la ultima medicion biometrica del cliente
   Ss.Getmedicion(Cid, Medicion, Clientesinmedicion);
   IF NOT Clientesinmedicion THEN
      Print("calcular_ejercicio: Ultimo ejercicio realizado: " & Medicion.Ejercicio);
   END IF;

   IF NOT Clientesinmedicion THEN
      -- El cliente tiene mediciones previas => no es su primer ejercicio.
      -- miramos que ejercicio realizo para recomendar el siguiente
      -- Ojo: No serviria ir aconsejando el primero e ir borrando de la lista de ejercicios
      -- porque la subtarea podria abortarse antes de que se devuelva el ejercicio al cliente
      -- por lo tanto, solo leeremos, sin modificar la estructura, aunque sea menos eficiente.
      It := Listas.Tabla_Ejercicios_Lists.First(Tabla);
      WHILE It /= Listas.Tabla_Ejercicios_Lists.Last(Tabla) AND NOT Encontrado LOOP
         Ultimoejercicio := Listas.Tabla_Ejercicios_Lists.Value(It);
         IF Ultimoejercicio = Medicion.Ejercicio THEN
            Encontrado:= True;
         ELSE
            It := Listas.Tabla_Ejercicios_Lists.Succ(It);
         END IF;
      END LOOP;

      -- el ejercicio siempre estara en la tabla
      -- cogemos el siguiente ejercicio que esta en la tabla
      It := Listas.Tabla_Ejercicios_Lists.Succ(It);
      IF It /= Listas.Tabla_Ejercicios_Lists.Last(Tabla) THEN
         Ejerc := Listas.Tabla_Ejercicios_Lists.Value(It);
      ELSE
         -- el cliente ya ha realizado todos los ejercicios
         Ejerc := Sinejercicio;
      END IF;

      -- ahora en base a las mediciones biometricas calculamos el tiempo de entrenamiento
      IF Ejerc /= Sinejercicio THEN
         IF Medicion.Ritmo = Normal AND Medicion.Tension = Normal AND Medicion.Frecuencia = Normal THEN
            Tiempo := T_Entreno_Normal;
         ELSE
            -- alguna medicion era mas alta o baja de lo normal
            Tiempo:= T_Entreno_Reducido;
         END IF;
      ELSE
         -- el cliente ya ha acabado de entrenar
         Tiempo := 0.0;
      END IF;
   ELSE
      -- el cliente va a realizar su primer ejercicio
      -- no tenia una medicion previa
      It := Listas.Tabla_Ejercicios_Lists.First(Tabla);
      Ejerc:=Listas.Tabla_Ejercicios_Lists.Value(It);
      Tiempo := T_Entreno_Normal;
   END IF;
END Calcular_Ejercicio;
